package CifreRomane;

import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Main extends JFrame implements ActionListener{
//cele 3 variabile determina cei 3 parametrii ai ferestrei.
// Cele 2 casete text(parametru si rezultat) si butonul
// la a carui apasare se face calculul
JButton submit;
JTextField parametru;
JTextField rezultat;

public void creareMediuGrafic(){
// 'fereastra' este containerul in care vor fi asezate
// butoanele si casutele text
JFrame fereastra=new JFrame();
fereastra.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fereastra.setAlwaysOnTop(true);
Container suprafata=fereastra.getContentPane();
suprafata.setLayout(new BoxLayout(suprafata,BoxLayout.Y_AXIS));

//obiectele se aseaza pe rand in zona de reprezentare
// a ferestrei obtinuta cu getContentPane()
JLabel info=new JLabel("Introduceti numarul in cifre romane:");
info.setAlignmentX(Component.CENTER_ALIGNMENT);
suprafata.add(info);

parametru=new JTextField(12);
parametru.setAlignmentX(Component.CENTER_ALIGNMENT);
suprafata.add(parametru);

submit=new JButton("Calculeaza");
submit.setAlignmentX(Component.CENTER_ALIGNMENT);
suprafata.add(submit);
submit.addActionListener(this);

rezultat=new JTextField(12);
rezultat.setAlignmentX(Component.CENTER_ALIGNMENT);
suprafata.add(rezultat);
rezultat.setEditable(false);

// se incarca elementele in fereastra, functia pack
//si se face fereastra vizibila
fereastra.pack();
fereastra.setVisible(true);
}

// functia care 'asculta' la apasarea butonului
public void actionPerformed(ActionEvent event) {
if (event.getSource().equals(submit)){
rezultat.setText(calculat(parametru.getText()));
}
}

// functia in care se face trimiterea spre functiile
// de interpretare din diferitele clase de interpretare
public String calculat(String sirPars){
// de tip context este rezultatul care va fi dat
// ca parametru diferitelor functii
// interpretor pentru a fi modificat
    Context rezultat = new Context();
sirPars = sirPars.toUpperCase();
char[] lista = sirPars.toCharArray();
for (char c : lista) {
// ExpresieAbstracta este clasa abstracta care tine
// antetul functiei interpretor
ExpresieAbstracta expr=new ExpresieNula();
switch (c) {
case 'I':
expr = new Unu();
break;
case 'V':
expr = new Cinci();
break;
case 'X':
expr = new Zece();
break;
case 'L':
expr = new CinciZeci();
break;
case 'C':
expr = new Suta();
break;
case 'D':
expr = new CinciSute();
break;
case 'M':
expr = new Mie();
break;
}
expr.interpretor(rezultat);
}
return String.valueOf(rezultat.returneazaFinal());
}

// functia principala care lanseaza modulul grafic
public static void main(String[]args){
Main p=new Main();
p.creareMediuGrafic();
}
}
